/**
 * @class Ext.tree.CheckboxTree 含有checkbox的树状菜单
 * @param {Object}
 *            config中的参数 el 必输入 dataUrl 必输入 rootText 必输入 rootId 默认值为0
 */
Ext.tree.CheckboxTree=function(config){	
	
	var myTreeLoader=new Ext.tree.TreeLoader({
			dataUrl:config.dataUrl
	});
	
	myTreeLoader.on("beforeload", function(treeLoader, node) {
        treeLoader.baseParams.check = node.attributes.checked;
    }, this);
	
	Ext.tree.CheckboxTree.superclass.constructor.call(this,{
		animate:true,
		enableDD:true,
		autoScroll:true,
		title:config.title,
		useArrows:true,
		containerScroll:true,
		dropConfig: {appendOnly:true},
		el:config.el,
		root:new Ext.tree.AsyncTreeNode({
			text:config.rootText,
			draggable:false,
			checked:true,
			id:'0'||config.rootId
		}),
		loader:myTreeLoader
	});
   	
    new Ext.tree.TreeSorter(this,{folderSort:true});
	
    this.on({
    	'checkchange':{
    		fn:this.checkChange,
    	   	scope:this
    	},
    	'click ':{
    		fn:this.click,
    	   	scope:this
    	}
    });   
}

Ext.extend(Ext.tree.CheckboxTree, Ext.tree.TreePanel,{
	/**
	 * 展开根节点
	 * 
	 * @return 返回根节点
	 */
	expandRoot:function(){
		this.root.expand();
		return this.root;
	},
	click:function(node,e){
		
	},
	checkChange:function(node,checked){
            var parentNode=node.parentNode;
			
            
            node.eachChild(function(child) {
				child.ui.toggleCheck(checked);
				child.attributes.checked = checked;
			});
            /**
             * 此如果此节点有父节点，则判断此父节点的子节点是否全为真
             * 如果全为真则此父节点也为真
            */     
            if(checked&&parentNode&&!parentNode.attributes.checked){
               this.changeCheckParent(node,checked);
            }       
    },
    changeCheckParent:function(node,checked){
    	 var parentNode=node.parentNode;
    	 if(checked){
                    var nodes=parentNode.childNodes;
                    for(var i=0;i<nodes.length;i++){
                        /**
                         * 当一个父节点的子节点中的一个节点为false是，此复节点应为false
                         */
                        if(!nodes[i].ui.isChecked()){   
                            /**
                             * 如果此父节点为真时，改变父节点的状态
                             */
                            if(parentNode.ui.isChecked()){
                                // parentNode.attributes.checked=false;
                                parentNode.ui.toggleCheck(false);
                            }
                            return ;
                        }
                    }
                    // parentNode.attributes.checked=true;
                    parentNode.ui.toggleCheck(true);                   
                   
        }else{
        	parentNode.ui.toggleCheck(false);
        }
        
        if(parentNode.parentNode){
            this.changeCheckParent.createDelegate(this,[parentNode,checked])();
        }
        
    }
});